import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: NotificationRoute(),
    );
  }
}

// 自定义通知

// 1、定义一个通知类继承自Notification类；
class MyNotification extends Notification {
  MyNotification(this.msg);
  final String msg;
}

// 2、分发通知
// Notification有一个 dispatch(context) 方法，用于分发通知
// 我们说过context实际上就是操作Element的一个接口，
// 它与Element树上的节点是对应的，通知会从context对应的Element节点向上冒泡。

class NotificationRoute extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return NotificationRouteState();
  }
}

class NotificationRouteState extends State<NotificationRoute> {
  String _msg = '';

  @override
  Widget build(BuildContext context) {
    // 监听通知
    return Scaffold(
      appBar: AppBar(
        title: Text('自定义Notification'),
      ),
      body: NotificationListener<MyNotification>(
        onNotification: (notification) {
          setState(() {
            _msg += notification.msg + '  ';
          });
        },
        child: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              // 因为这个context是根Context，而NotificationListener是监听的子树，
              // 所以我们通过Builder来构建RaisedButton，来获得按钮位置的context。
              Builder(
                builder: (context) {
                  return RaisedButton(
                    child: Text('Send Notification'),
                    onPressed: () => MyNotification('Hi').dispatch(context),
                  );
                },
              ),
              Text(_msg),
            ],
          ),
        ),
      ),
    );
  }
}
